package com.zxc.Util;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Random;

public class RandomValidateCode {

    public static final String RANDOMCODEKEY = "randomcode_key";//放到session中的key


    private Random random = new Random();

    private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生的字符串



    private int width = 80;//图片宽

     private int height = 26;//图片高
     private int lineSize = 40;//干扰线数量
        private int stringNum = 4;//随机产生字符数量


    /**

     * 生成随机图片

     */

       public void getRandcode(HttpServletRequest request,
    HttpServletResponse response) {
    HttpSession session = request.getSession();
    //BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
     BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);
     //产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
           Graphics g = image.getGraphics();
           g.fillRect(0, 0, width, height);
           g.setFont(new Font("Times New Roman",Font.ROMAN_BASELINE,18));
           g.setColor(getRandColor(160, 200));
//绘制干扰线
           for(int i=0;i<=lineSize;i++){
               drowLine(g);
           }
           //绘制随机字符
           String randomString = "";
           for(int i=1;i<=stringNum;i++){
               randomString=drowString(g,randomString,i);
           }
           session.removeAttribute(RANDOMCODEKEY);
           try {
                   //将内存中的图片通过流动形式输出到客户端
               System.out.println(response.getOutputStream());
               ImageIO.write(image, "JPEG", response.getOutputStream());
               } catch (Exception e) {
                   e.printStackTrace();
               }
       }
       /*

    * 获得字体

    */

         private Font getFont(){

return new Font("Fixedsys",Font.CENTER_BASELINE,18);

}
/*

    * 获得颜色

    */
 private Color getRandColor(int fc,int bc){

if(fc > 255)

fc = 255;

if(bc > 255)

bc = 255;

int r = fc + random.nextInt(bc-fc-16);

int g = fc + random.nextInt(bc-fc-14);

int b = fc + random.nextInt(bc-fc-18);

return new Color(r,g,b);

}



 /*

    * 绘制字符串

    */

private String drowString(Graphics g,String randomString,int i){

g.setFont(getFont());

g.setColor(new Color(random.nextInt(101),random.nextInt(111),random.nextInt(121)));

String rand = String.valueOf(getRandomString(random.nextInt(randString.length())));

randomString +=rand;

g.translate(random.nextInt(3), random.nextInt(3));

g.drawString(rand, 13*i, 16);

 return randomString;

}

/*

    * 绘制干扰线

    */

private void drowLine(Graphics g){

int x = random.nextInt(width);

int y = random.nextInt(height);

int xl = random.nextInt(13);

int yl = random.nextInt(15);

g.drawLine(x, y, x+xl, y+yl);

 }

/*

    * 获取随机的字符

    */

public String getRandomString(int num){

 return String.valueOf(randString.charAt(num));

}

}
